package gsql

import (
	"fmt"
)

// 查询构建器
type queryBuilder struct {
	cols *Columns // 查询列名称
	form *Form    // 数据表
	// joins   *Joins    // 表连接
	// where   *Where    // 查询条件
	// groupBy *GroupBy  // 分组
	// orderBy *OrderBy  // 排序
	// offset  int       // Offset
	// limit   int       // Limit
}

// 创建新的查询器
func NewQuery() *queryBuilder {
	return &queryBuilder{
		cols: &Columns{},
		form: &Form{},
		// 	joins:   &Joins{},
		// 	where:   &Where{},
		// 	groupBy: &GroupBy{},
		// 	orderBy: &OrderBy{},
		// 	offset:  0,
		// 	limit:   10,
	}
}

// select clause
func (q *queryBuilder) Select(columns ...any) *queryBuilder {
	// cols, ok := q.cols.(*Columns)
	// if ok != true {
	// 	// 输出错误信息
	// 	return q
	// }

	q.cols.Append(columns...)
	return q
}

// form clause
//
//	@param table		表名称, `user`, `user u`, `user as u`
func (q *queryBuilder) From(table string) *queryBuilder {
	q.form = &Form{
		pred: table,
		args: nil,
	}
	return q
}

// // join
// func (q *queryBuilder) Join(join string, args ...any) *queryBuilder {
// 	q.joins.Append(join, args)
// 	return q
// }

// // Where 添加查询条件
// //
// //	@param pred 查询条件语句, 支持以下类型
// //		- 表达式类型: 如 Expr{}, Eq{}, In{}, Like{} 等
// //		- 字符串的Sql表达式: 如 Where("name = ?", "larry")
// //	 	- 子语句: Where("id IN(?)", gsql.Select("uid").Form("job").Where("job = ?", 12))
// func (q *queryBuilder) Where(pred any, args ...any) *queryBuilder {
// 	return q
// }

// // 获取Sql语句
func (q *queryBuilder) ToSql() {

	fmt.Printf(">>> 开始构建Sql语句\n")

	// 用于接收构建的sql和参数
	// var s strings.Builder
	// var args []any

	var b = &Builder{}

	b.Builder("SELECT ")
	b.Builder(q.cols)

	b.Builder("FORM ")
	b.Builder(q.form)
	// b.Builder(q.form)

	// for _, col := range q.cols {
	// 	col.ToSql()
	// }

	// 	// 不使用 `+` 性能会更好

	// 	var s strings.Builder

	// 	// select cols
	// 	xx, _ := q.cols.ToSql()
	// 	s.WriteString("SELECT " + xx)

	// 	// form table
	// 	xb, _ := q.form.ToSql()
	// 	s.WriteString(" FORM " + xb)

	// 	// where
	// 	xw, _ := q.where.ToSql()
	// 	s.WriteString(" WHERE " + xw)

	// // s.WriteString("ad")
	fmt.Printf(">> sql: %s\n", b.Sql())
	fmt.Printf(">> args: %+v\n", b.Args())
}
